
package com.woniuxy.yogaapp.handler;

import java.io.File;
import java.util.List;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;

import com.woniuxy.yogaapp.dto.EvaluateDto;
import com.woniuxy.yogaapp.mapper.CoachMapper;
import com.woniuxy.yogaapp.mapper.StudentMapper;
import com.woniuxy.yogaapp.service.AppraiseService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import com.woniuxy.yogaapp.pojo.Coach;
import com.woniuxy.yogaapp.pojo.Student;
import com.woniuxy.yogaapp.service.StudentService;
import com.woniuxy.yogaapp.util.RegexUtil;
import lombok.Data;
import com.woniuxy.yogaapp.pojo.DetailOrder;
import com.woniuxy.yogaapp.pojo.OrderClass;
import com.woniuxy.yogaapp.service.OrderService;

import javax.annotation.Resource;

@Controller
@Data
@RequestMapping("/student")
@Scope("prototype")

public class StudentHandler {
	@Autowired
	private StudentService studentService;
	@Resource
	private OrderService orderService;
	@Resource
	private AppraiseService appraiseService;
	@Resource
	private CoachMapper coachMapper;
	@Resource
	private StudentMapper studentMapper;


	// 查询所有
	@RequestMapping("/all")
	@ResponseBody
	public List<Student> studentAll() {
		return studentService.findAllStudent();
	}

	/*
	 * 我的签约教练
	 */
	@RequestMapping("/findcoach")
	@ResponseBody
	public List<Coach> studentFindCoach() {
		Student s = studentService.findBySidCoach(1);
		System.out.println(s.getCoachs());
		return s.getCoachs();
	}

	/*
	 * student 需要参数 名字sname、电话stel、学员qq sqq 年龄sage 性别ssex 头像simage 信息权限spower
	 * 学员昵称snickname 邮箱smail
	 */
	@RequestMapping("/info")

	public String addStudentInfo(Student student, @RequestParam("headImage") MultipartFile file,
			HttpServletRequest request) throws Exception {
		String result = "添加失败！";
		// 1.获取subject对象
		Subject currentUser = SecurityUtils.getSubject();
		Session session = currentUser.getSession();
		int uid = (int) session.getAttribute("uid");
		student.setUid(uid);
		// 1.电话合法性判断
		if (student.getStel() != null && student.getStel().length() != 0) {
			if (!RegexUtil.isMobile(student.getStel())) {
				request.setAttribute("studenttishi", "电话号码有误，请输入正确11位手机号码！");
				return "/html/studenttishi.html";
			}
		}
		// 2.邮箱合法性判断
		if (student.getSmail() != null && student.getSmail().length() != 0) {
			if (!RegexUtil.isEmail(student.getSmail())) {
				request.setAttribute("studenttishi", "邮箱格式有误！");
				return "/html/studenttishi.html";
			}
		}
		// 判断头像是否为空 上传的头像也为空 添加默认头像
		if (file.getSize() == 0 && (student.getSimage() == null || student.getSimage().length() == 0)) {
			// 2.1.获取文件的路径（相对路径），将所有的注册信息保存到数据库
			// 添加默认老鼠头像
			student.setSimage("../image/1.jpg");
		}
		// 如果上传的头像不为空 将图片的路径给student.simage 赋值
		if (file.getSize() != 0) {
			// 执行到此处，前端提交的数据全拿到了
			// 1.将文件保存到Tomcat服务器本地
			// 1.1.获取保存文件的文件夹的路径
			String path = request.getServletContext().getRealPath("");
			File dir = new File(path);
			// 获得webapp文件夹的file对象
			File webapp = dir.getParentFile();
			String fileName = file.getOriginalFilename();
			// 生成新文件名
			String newName = UUID.randomUUID().toString();
			// 得到文件后缀名
			String type = fileName.substring(fileName.lastIndexOf("."));
			newName += type;
			// 拼接新文件的路径
			File uploadFile = new File(webapp, "webapp\\image\\" + newName);
			// 1.2.将文件保存到服务器本地
			file.transferTo(uploadFile);
			// 2.1.获取文件的路径（相对路径），将所有的注册信息保存到数据库
			student.setSimage("/image/" + newName);
		}
		// 数据库查询该用户 看student表有没有 如果有调用update方法 如果是新用户就调用插入方法
		Student student1 = studentService.findStudentByUid(student);
		if (student1 != null) {
			// 调用update方法
			int row = studentService.updateStudentInfo(student);
			if (row == 1) {
				request.setAttribute("studenttishi", "修改成功！");
				return "/html/studenttishi.html";
			}
		} else {
			// 新用户调用插入方法 保存student到数据库
			result = studentService.addStudentInfo(student);
			request.setAttribute("studenttishi", result);
			return "/html/studenttishi.html";

		}
		request.setAttribute("studenttishi", result);
		return "/html/studenttishi.html";
	}

	/*
	 * 点击个人信息完善 查看数据库查看该用户的个人信息 显示到前端
	 */
	@RequiresRoles(value = { "student", "common" }, logical = Logical.OR)
	@RequestMapping("/showMe")
	public ModelAndView showMe() {
		Student student = new Student();
		// 1.获取subject对象
		Subject currentUser = SecurityUtils.getSubject();
		Session session = currentUser.getSession();
		int uid = (int) session.getAttribute("uid");
		student.setUid(uid);
		Student studentMe = studentService.findStudentByUid(student);
		if (studentMe == null) {
			studentMe = new Student();
		}
		// 3.跳转页面
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("student", studentMe);
		modelAndView.setViewName("/studentInfo.html");
		return modelAndView;
	}

	// 首先先判断当前的会员是否有未被教练处理的订单，如果有，就覆盖原来的订单
	// 没有就新创建订单,上课课时（courseperiod），金额，教练收到请求后，拒绝，生成未成功订单）
	// 学员(sid)申请私教要求（选择教练（cid），选择上课时间(coursetime)，
	/*
	 *
	 * 前端参数(数据):sid,cid,coursetime,courseperiod,money，course 后端参数：请求时间，状态为请求
	 */
	/*
	 * r.setCid(1); r.setSid(1); r.setCourse("头碎大石"); r.setMoney(50);
	 * r.setCoursetime("早"); r.setCourseperiod("1");
	 */
	@RequestMapping("/createorder")
	@ResponseBody
	public String createOrder(OrderClass orderClass) {
		String result = "创建失败";
		orderClass.setCid(coachMapper.findCoachByUid(new Coach(orderClass.getUid())).getCid());

		Subject currentUser = SecurityUtils.getSubject();

		Session session = currentUser.getSession();
		System.out.println(session);
		int uid = (int) session.getAttribute("uid");
		System.out.println(uid+"123123");
        //从当前获取uid,再查到sid
		orderClass.setSid(studentMapper.findStudentByUid(new Student(uid)).getSid());

		DetailOrder d = new DetailOrder();
		d.setState(1);

		// 先查询看是否有未处理的订单
		result = orderService.selectishave(orderClass);
		if (result.contains("没有")) {
			result = orderService.createOrder(orderClass);
			result = "新创建成功";
			return result;
		}
		result = "覆盖创建成功";

		return result;
	}

	// 确认支付，输入支付密码后确定
	/*
	 * 得到消息，在我的订单中点击支付。 通过比较余额，如果余额够，直接从余额扣除，不够提示先充值 钱够流程：
	 * 1.通过传入sid，did找到uid在找到pockek，减少支付用户的余额（金额必须够），（输入支付密码）用uid查密码
	 *
	 * 插入支付时间 2.相应对应数量的金额在平台的钱包上加上 3.通知教练，学员已经完成订单支付 4.等待1天后 ，钱转入cid教练 5.更改订单状态
	 *
	 * 前端参数：sid,cid,money,oid,detailoid
	 *
	 */
	/*
	 * orderClass.setSid(1); orderClass.setCid(1); orderClass.setMoney(50);
	 * orderClass.setOid(7); orderClass.setDetailoid(19);
	 */
	@RequestMapping("/payorder")
	@ResponseBody
	public String payOrder(OrderClass orderClass) {

		DetailOrder d = new DetailOrder();
		orderClass.setCurrentDetailOrders(d);
		String result = orderService.payOrder(orderClass);

		return result;
	}

	// 评价
	/*
	 * 流程： 传入oid,sid,cid,detailoid,mes,state,aptime
	 * 1。通过sid，cid分别找到他们的uid，自己添加aptime，存入评论表，并把评论表的pid返回 2.插入pid插入detailorid表中
	 * 3.改变订单状态 4.通知教练
	 *
	 * 前端参数：oid,sid,cid,mes,detailoid,state
	 */
	/*
	 * evaluateDto.setOid(7); evaluateDto.setSid(1); evaluateDto.setCid(1);
	 * evaluateDto.setMes("教的很好"); evaluateDto.setDetailoid(13);
	 */
	@RequestMapping("/evaluate")
	@ResponseBody
	public String evaluate(EvaluateDto evaluateDto) {

		String result = appraiseService.evaluate(evaluateDto);

		return result;

	}

	@RequestMapping("/fixevaluate")
	@ResponseBody
	public String fixEvaluate(EvaluateDto evaluateDto) {

		String result = appraiseService.fixevaluate(evaluateDto);

		return result;

	}

}
